package ar.edu.utn.frba.disenio.model;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.uqbar.commons.utils.Observable;

@Observable
abstract public class Usuario {
	
	Collection<Busqueda> busquedas = new ArrayList<Busqueda>();
	Collection<Asiento> compras = new ArrayList<Asiento>();
	Collection<Asiento> reservas = new ArrayList<Asiento>();
	String dni, nombre;
	
	abstract public boolean esVip();
	abstract public BigDecimal adicional();
	
	public Usuario(String unDNI, String unNombre){
		this.dni = unDNI;
		this.nombre = unNombre;
	}
	
	protected void agregarBusqueda(Busqueda unaBusqueda){
		busquedas.add(unaBusqueda);
	}
	
	public BigDecimal getMonto(){
		BigDecimal acum = new BigDecimal(0);
		for (Asiento unAsiento : compras){
			acum = acum.add(unAsiento.getPrecio(this));
		}
		return acum;
	}
	
	public Collection<Busqueda> getBusquedas() {
		return busquedas;
	}

	public void registrarCompra(Asiento unAsiento) {
		compras.add(unAsiento);
	}
	
	public List<Asiento> aplicarFiltro(List<Asiento> unaListaDeAsientosConSuperOfertas) {
		if(this.esVip()){
			return unaListaDeAsientosConSuperOfertas;
		} 
		else {
			return this.quitarSuperOfertas(unaListaDeAsientosConSuperOfertas);
		}
	}
	
	public boolean esElMismoUsuario(Usuario unUsuario){
		return this.getDni().equals(unUsuario.getDni());
	}
		
	private List<Asiento> quitarSuperOfertas(List<Asiento> unaListaDeAsientosConSuperOfertas) {
		List<Asiento> asientosDisponiblesSinSuperOfertas = new ArrayList<Asiento>();
		
		for (Asiento unAsiento : unaListaDeAsientosConSuperOfertas){
				if (!(unAsiento.esSuperOferta())){
					asientosDisponiblesSinSuperOfertas.add(unAsiento);
				}
			}
		
		return asientosDisponiblesSinSuperOfertas;
	}
	
	public void addReserva(Asiento unAsiento){
		this.getReservas().add(unAsiento);
	}
	
	public String getDni(){
		return dni;
	}
	
	public boolean esEstandar(){
		return false;
	}
	
	public Collection<Asiento> getCompras() {
		return this.compras;
	}
	
	public Collection<Asiento> getReservas() {
		return this.reservas;
	}
	
	public String getNombre(){
		return this.nombre;
	}
	
}
